<?php

namespace Application\Site1Bundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Application\Site1Bundle\DataSource\DatabaseDataSource;



class ModuleController extends Controller
{
    private function getRole()
    {
        $roles = array(
            'guest',
            'viewer',
            'editor',
            'admin'
        );
        return $roles[3];
    }

    /**
     * @return /Bundle/AclBundle/Acl
     */
    private function getACLService()
    {
        return $this->container->getAclService();
    }

    private function setupACL()
    {
        if(\count($this->getACLService()->getRoles()) > 1)
            return;
        $this->getACLService()
                ->addRole(new \Bundle\AclBundle\Role('guest'))
                ->addRole(new \Bundle\AclBundle\Role('viewer'))
                ->addRole(new \Bundle\AclBundle\Role('editor'))
                ->addRole(new \Bundle\AclBundle\Role('admin'));


        $this->getACLService()
                ->addResource(new \Bundle\AclBundle\Resource('view'))
                ->addResource(new \Bundle\AclBundle\Resource('create'))
                ->addResource(new \Bundle\AclBundle\Resource('edit'))
                ->addResource(new \Bundle\AclBundle\Resource('visibility'))
                ->addResource(new \Bundle\AclBundle\Resource('delete'))
        ;

        // гость ничего не может делать
        $this->getACLService()->deny('guest');

        // наблюдатель можеть только смотреть
        $this->getACLService()->allow('viewer', 'view');

        // редактор может изменять видимость
        $this->getACLService()->allow('editor', 'view');
        $this->getACLService()->allow('editor', 'visibility');

        // админ может делать всё
        $this->getACLService()->allow('admin');


    }

    public function createAction()
    {
        if($this['fireice']->getCurrentNode() == null)
        {
            throw new \Exception('No direct accsess!');
        }
        // Текущий нод
        $currentNode = $this['fireice']->getCurrentNode();

        // Объект текущей ноды
        $node = $em = $this->container->getDoctrine_ORM_EntityManagerService()->
                    getRepository('Bundle\TreeBundle\Entities\Tree')->find($currentNode);

        // Получение модуля связанного с текущей нодой
        $module = $node->getDescription()->getModule();

        // Получение объекта модуля для текущей ноды
        $module = $this['fireice']->modules[$module];

        $module->boot();

        // Установка шаблона
        $module->setTemplate('Site1Bundle:Module:create:twig');

        if('POST' == $this['Request']->getMethod())
        {
        	$entity = $module->processArrayData($this['Request']->request->all());

        	$em = $this->container->getDoctrine_ORM_EntityManagerService();

            $em->persist($entity);
            
            $em->flush();

            return $this->redirect($this['router']->generate($node->getId() . '_index'));
        }

        return $this->render($module->getTemplate(), array('module' => $module));
    }

    /**
     * Включение отображеения
     * @param int $id Ключ элемента, который надо включить
     */
    public function showAction($id)
    {
        if($this['fireice']->getCurrentNode() == null)
        {
            throw new \Exception('No direct accsess!');
        }
        // Текущий нод
        $currentNode = $this['fireice']->getCurrentNode();

        // Объект текущей ноды
        $node = $em = $this->container->getDoctrine_ORM_EntityManagerService()->
                    getRepository('Bundle\TreeBundle\Entities\Tree')->find($currentNode);

        // Получение модуля связанного с текущей нодой
        $module = $node->getDescription()->getModule();

        // Получение объекта модуля для текущей ноды
        $module = $this['fireice']->modules[$module];

        $module->boot();

        $em = $this->container->getDoctrine_ORM_EntityManagerService();

        $entity = $em->find($module->getEntityClassName(), (int) $id);

        $entity->setHidden(false);

        $em->flush();

        return $this->redirect($this['router']->generate($node->getId() . '_index'));
        //return $this->forward('Site1Bundle:Module:index');

    }

    public function hideAction($id)
    {
        if($this['fireice']->getCurrentNode() == null)
        {
            throw new \Exception('No direct accsess!');
        }
        // Текущий нод
        $currentNode = $this['fireice']->getCurrentNode();

        // Объект текущей ноды
        $node = $em = $this->container->getDoctrine_ORM_EntityManagerService()->
                    getRepository('Bundle\TreeBundle\Entities\Tree')->find($currentNode);

        // Получение модуля связанного с текущей нодой
        $module = $node->getDescription()->getModule();

        // Получение объекта модуля для текущей ноды
        $module = $this['fireice']->modules[$module];

        $module->boot();

        $em = $this->container->getDoctrine_ORM_EntityManagerService();

        $entity = $em->find($module->getEntityClassName(), (int) $id);

        $entity->setHidden(true);

        $em->flush();

        return $this->redirect($this['router']->generate($node->getId() . '_index'));
    }

    public function deleteAction($id)
    {

        if($this['fireice']->getCurrentNode() == null)
        {
            throw new \Exception('No direct accsess!');
        }
        // Текущий нод
        $currentNode = $this['fireice']->getCurrentNode();

        // Объект текущей ноды
        $node = $em = $this->container->getDoctrine_ORM_EntityManagerService()->
                    getRepository('Bundle\TreeBundle\Entities\Tree')->find($currentNode);

        // Получение модуля связанного с текущей нодой
        $module = $node->getDescription()->getModule();

        // Получение объекта модуля для текущей ноды
        $module = $this['fireice']->modules[$module];

        $module->boot();

        $em = $this->container->getDoctrine_ORM_EntityManagerService();

        $entity = $em->find($module->getEntityClassName(), (int) $id);

        $em->remove($entity);

        $em->flush();

        return $this->redirect($this['router']->generate($node->getId() . '_index'));
    }

    public function editAction($id)
    {
        if($this['fireice']->getCurrentNode() == null)
        {
            throw new \Exception('No direct accsess!');
        }
        // Текущий нод
        $currentNode = $this['fireice']->getCurrentNode();

        // Объект текущей ноды
        $node = $this->container->getDoctrine_ORM_EntityManagerService()->
                    getRepository('Bundle\TreeBundle\Entities\Tree')->find($currentNode);

        // Получение модуля связанного с текущей нодой
        $module = $node->getDescription()->getModule();

        // Получение объекта модуля для текущей ноды
        $module = $this['fireice']->modules[$module];

        $module->getDataSource()->find($id);
        
        $module->boot();
        
        if('POST' == $this['Request']->getMethod())
        {
            $datasource = $module->getDataSource();
            
            $entity = $this->container->getDoctrine_ORM_EntityManagerService()->
                    getRepository($datasource->getEntityClassName())->find($id);
        
        	$entityM = $module->processArrayData($this['Request']->request->all());
        	
        	$entityM->setId($entity->getId());
        	
        	$this->container->getDoctrine_ORM_EntityManagerService()->merge($entityM);
        	$this->container->getDoctrine_ORM_EntityManagerService()->flush();
        	
        	
        	
        	return $this->redirect($this['router']->generate($node->getId() . '_index'));
        }
        
        $module->setTemplate('Site1Bundle:Module:edit:twig');

        return $this->render($module->getTemplate(), array('module' => $module));
    }

    public function indexAction()
    {
        if($this['fireice']->getCurrentNode() == null)
        {
            throw new \Exception('No direct accsess!');
        }
        
        // Текущий нод
        $currentNode = $this['fireice']->getCurrentNode();

        // Объект текущей ноды
        $node = $em = $this->container->getDoctrine_ORM_EntityManagerService()->
                    getRepository('Bundle\TreeBundle\Entities\Tree')->find($currentNode);

        // Получение модуля связанного с текущей нодой
        $module = $node->getDescription()->getModule();

        // Получение объекта модуля для текущей ноды
        $module = $this['fireice']->modules[$module];

        $module->getDataSource()->all();
        
        $module->boot();

        
        return $this->render($module->getTemplate(), array('module' => $module));
    }

    public function viewAction($id)
    {
    	try{
        return $this->redirect($this['router']->generate($id . '_index'));
    	}
    	catch(\InvalidArgumentException $e)
    	{
    	   die('Routing have to be rebuilded');
    	}
    }
}
